<?php


namespace common\utils;

/**
 * 搜索供应商名称拆分出品牌词和地域
 * author:caiwen
 * date:2020/11/19 14:56
 */
class AreaAnalyzerUtils
{
    //省市区字典
    private static $areaDict = ['北京','北京市','石家庄','石家庄市','杭州','杭州市','宁波','宁波市','温州','温州市','嘉兴','嘉兴市','湖州','湖州市','绍兴','绍兴市','金华','金华市','衢州','衢州市','舟山','舟山市','台州','台州市','衡水','衡水市','丽水','丽水市','安徽','安徽省','淮北','淮北市','合肥','合肥市','六安','六安市','亳州','亳州市','宿州','宿州市','阜阳','阜阳市','蚌埠','蚌埠市','淮南','淮南市','唐山','唐山市','滁州','滁州市','巢湖','芜湖','芜湖市','马鞍山','马鞍山市','安庆','安庆市','池州','池州市','铜陵','铜陵市','宣城','宣城市','黄山','黄山市','福建','福建省','秦皇岛','秦皇岛市','福州','福州市','厦门','厦门市','莆田','莆田市','三明','三明市','泉州','泉州市','漳州','漳州市','南平','南平市','龙岩','龙岩市','宁德','宁德市','江西','江西省','张家口','张家口市','南昌','南昌市','景德镇','景德镇市','萍乡','萍乡市','九江','九江市','新余','新余市','鹰潭','鹰潭市','赣州','赣州市','吉安','吉安市','宜春','宜春市','抚州','抚州市','承德','承德市','上饶','上饶市','山东','山东省','济南','济南市','青岛','青岛市','淄博','淄博市','泰安','泰安市','济宁','济宁市','德州','德州市','日照','日照市','潍坊','潍坊市','邯郸','邯郸市','枣庄','枣庄市','临沂','临沂市','莱芜','滨州','滨州市','聊城','聊城市','菏泽','菏泽市','烟台','烟台市','威海','威海市','东营','东营市','河南','河南省','沧州','沧州市','郑州','郑州市','洛阳','洛阳市','开封','开封市','平顶山','平顶山市','南阳','南阳市','焦作','焦作市','信阳','信阳市','济源','济源市','周口','周口市','安阳','安阳市','邢台','邢台市','驻马店','驻马店市','新乡','新乡市','鹤壁','鹤壁市','商丘','商丘市','漯河','漯河市','许昌','许昌市','三门峡','三门峡市','濮阳','濮阳市','湖北','湖北省','武汉','武汉市','保定','保定市','宜昌','宜昌市','荆州','荆州市','十堰','十堰市','襄阳','襄阳市','黄石','黄石市','黄冈','黄冈市','恩施土家族苗族自治州','恩施土家族苗族自治州','荆门','荆门市','咸宁','咸宁市','孝感','孝感市','北京','廊坊','廊坊市','鄂州','鄂州市','天门','天门市','仙桃','仙桃市','随州','随州市','潜江','潜江市','神农架','神农架林区','湖南','湖南省','长沙','长沙市','岳阳','岳阳市','常德','常德市','山西','山西省','株洲','株洲市','娄底','娄底市','衡阳','衡阳市','湘潭','湘潭市','怀化','怀化市','益阳','益阳市','邵阳','邵阳市','永州','永州市','张家界','张家界市','吉首','太原','太原市','郴州','郴州市','湘西州','湘西土家族苗族自治州','广东','广东省','广州','广州市','深圳','深圳市','珠海','珠海市','汕头','汕头市','佛山','佛山市','东莞','东莞市','中山','中山市','大同','大同市','江门','江门市','惠州','惠州市','肇庆','肇庆市','阳江','阳江市','韶关','韶关市','河源','河源市','梅州','梅州市','清远','清远市','云浮','云浮市','茂名','茂名市','朔州','朔州市','汕尾','汕尾市','揭阳','揭阳市','潮州','潮州市','湛江','湛江市','海南','海南省','海口','海口市','三亚','三亚市','五指山','五指山市','文昌','文昌市','琼海','琼海市','忻州','忻州市','万宁','万宁市','儋州','儋州市','东方','东方市','定安县','定安县','屯昌县','屯昌县','澄迈县','澄迈县','临高县','临高县','白沙黎族自治县','白沙黎族自治县','昌江黎族自治县','昌江黎族自治县','乐东黎族自治县','乐东黎族自治县','长治','长治市','陵水黎族自治县','陵水黎族自治县','保亭黎族苗族自治县','保亭黎族苗族自治县','琼中黎族苗族自治县','琼中黎族苗族自治县','洋浦经济开发区','广西','广西壮族自治区','南宁','南宁市','柳州','柳州市','桂林','桂林市','梧州','梧州市','北海','北海市','阳泉','阳泉市','防城港','防城港市','钦州','钦州市','贵港','贵港市','玉林','玉林市','百色','百色市','贺州','贺州市','河池','河池市','来宾','来宾市','崇左','崇左市','四川','四川省','晋中','晋中市','成都','成都市','自贡','自贡市','攀枝花','攀枝花市','泸州','泸州市','德阳','德阳市','绵阳','绵阳市','广元','广元市','遂宁','遂宁市','内江','内江市','资阳','资阳市','吕梁','吕梁市','乐山','乐山市','眉山','眉山市','南充','南充市','宜宾','宜宾市','广安','广安市','达州','达州市','巴中','巴中市','雅安','雅安市','阿坝藏族羌族自治州','阿坝藏族羌族自治州','甘孜藏族自治州','甘孜藏族自治州','天津','天津市','晋城','晋城市','凉山彝族自治州','凉山彝族自治州','贵州','贵州省','贵阳','贵阳市','遵义','遵义市','安顺','安顺市','六盘水','六盘水市','毕节地区','毕节市','铜仁地区','铜仁市','黔东南区','黔东南苗族侗族自治州','黔南州','黔南布依族苗族自治州','临汾','临汾市','黔西南区','黔西南布依族苗族自治州','云南','云南省','昆明','昆明市','昭通','昭通市','曲靖','曲靖市','丽江','丽江市','思茅','保山','保山市','临沧','临沧市','玉溪','玉溪市','运城','运城市','迪庆藏族自治州','迪庆藏族自治州','大理白族自治州','大理白族自治州','楚雄彝族自治州','楚雄彝族自治州','红河哈尼族彝族自治州','红河哈尼族彝族自治州','德宏傣族景颇族自治州','德宏傣族景颇族自治州','文山壮族苗族自治州','文山壮族苗族自治州','怒江傈僳族自治州','怒江傈僳族自治州','西双版纳傣族自治州','西双版纳傣族自治州','西藏','西藏自治区','拉萨','拉萨市','辽宁','辽宁省','日喀则地区','日喀则市','林芝地区','林芝市','山南地区','山南市','那曲地区','那曲市','昌都地区','昌都市','阿里地区','阿里地区','陕西','陕西省','西安','西安市','铜川','铜川市','宝鸡','宝鸡市','沈阳','沈阳市','咸阳','咸阳市','渭南','渭南市','延安','延安市','汉中','汉中市','榆林','榆林市','安康','安康市','商洛','商洛市','甘肃','甘肃省','兰州','兰州市','嘉峪关','嘉峪关市','大连','大连市','金昌','金昌市','白银','白银市','天水','天水市','酒泉','酒泉市','张掖','张掖市','武威','武威市','定西','定西市','陇南','陇南市','平凉','平凉市','庆阳','庆阳市','鞍山','鞍山市','临夏回族自治州','临夏回族自治州','甘南藏族自治州','甘南藏族自治州','青海','青海省','西宁','西宁市','海东行署','海东市','海北藏族自治州','海北藏族自治州','海南藏族自治州','海南藏族自治州','海西州','海西蒙古族藏族自治州','黄南藏族自治州','黄南藏族自治州','玉树藏族自治州','玉树藏族自治州','抚顺','抚顺市','果洛藏族自治州','果洛藏族自治州','宁夏','宁夏回族自治区','银川','银川市','石嘴山','石嘴山市','吴忠','吴忠市','固原','固原市','中卫','中卫市','新疆','新疆维吾尔自治区','伊犁哈萨克自治州','伊犁哈萨克自治州','乌鲁木齐','乌鲁木齐市','本溪','本溪市','昌吉回族自治州','昌吉回族自治州','石河子','石河子市','克拉玛依','克拉玛依市','阿勒泰地区','阿勒泰地区','博尔塔拉蒙古自治州','博尔塔拉蒙古自治州','塔城地区','塔城地区','和田地区','和田地区','克孜勒苏柯尔克孜自治州','克孜勒苏柯尔克孜自治州','喀什地区','喀什地区','阿克苏地区','阿克苏地区','丹东','丹东市','巴音郭楞蒙古自治州','巴音郭楞蒙古自治州','吐鲁番地区','吐鲁番市','哈密地区','哈密市','五家渠','五家渠市','阿拉尔','阿拉尔市','图木舒克','图木舒克市','香港','香港特别行政区','香港','澳门','澳门特别行政区','澳门','天津','锦州','锦州市','台湾','台湾省','台湾','崇州市','营口','营口市','阜新','阜新市','辽阳','辽阳市','铁岭','铁岭市','朝阳','朝阳市','盘锦','盘锦市','葫芦岛','葫芦岛市','吉林','吉林省','长春','长春市','彭州','上海','上海市','吉林','吉林市','四平','四平市','辽源','辽源市','通化','通化市','白山','白山市','松原','松原市','白城','白城市','延边州','延边朝鲜族自治州','黑龙江','黑龙江省','哈尔滨','哈尔滨市','上海','齐齐哈尔','齐齐哈尔市','牡丹江','牡丹江市','佳木斯','佳木斯市','大庆','大庆市','鸡西','鸡西市','伊春','伊春市','双鸭山','双鸭山市','七台河','七台河市','鹤岗','鹤岗市','黑河','黑河市','重庆','重庆市','绥化','绥化市','大兴安岭地区','大兴安岭地区','内蒙古','内蒙古自治区','呼和浩特','呼和浩特市','包头','包头市','乌海','乌海市','赤峰','赤峰市','通辽','通辽市','鄂尔多斯','鄂尔多斯市','呼伦贝尔','呼伦贝尔市','重庆','巴彦淖尔','巴彦淖尔市','乌兰察布','乌兰察布市','锡林郭勒盟','锡林郭勒盟','兴安盟','兴安盟','阿拉善盟','阿拉善盟','江苏','江苏省','南京','南京市','苏州','苏州市','无锡','无锡市','常州','常州市','河北','河北省','扬州','扬州市','南通','南通市','镇江','镇江市','泰州','泰州市','淮安','淮安市','徐州','徐州市','盐城','盐城市','宿迁','宿迁市','连云港','连云港市','浙江','浙江省'];

    /**
     * 分词
     * @param $vStr
     * @return array
     */
    public static function tokenizer($vStr)
    {
        if ('' === $vStr) {
            return [];
        }
        if (empty(self::$areaDict)) {
            exit('词典为空');
        }
        $str = $vStr;
        //分词初步结果
        $result = [];
        while ('' !== $str) {
            $pos = 0;
            $t_str = $str;
            while (1) {
                if (in_array($t_str, self::$areaDict)) {
                    $result[] = [
                        'token' => $t_str,
                        'type' => 'area'
                    ];
                    $t_str = '';
                } else {
                    $pos++;
                    $t_str = mb_substr($str, $pos);
                    if (1 == mb_strlen($t_str)) {
                        $result[] = $t_str;
                        $t_str = '';
                    }
                }
                if ('' === $t_str) {
                    break;
                }
            }
            if (0 == $pos) {
                break;
            }
            $str = mb_substr($str, 0, $pos);
            if (1 == $pos && '' !== trim($str)) {
                $result[] = $str;
                break;
            }
        }
        $result = array_reverse($result);
        $result_merge_num = [];
        $last_num = '';
        foreach ($result as $word) {
            if (!is_array($word) && 1 == mb_strlen($word)) {
                $last_num .= $word;
                continue;
            }
            $result_merge_num[] = $word;
        }
        if ('' !== $last_num) {
            $result_merge_num[] = [
                'token' => $last_num,
                'type' => 'words'
            ];
        }
        return $result_merge_num;
    }

    public static function tokenizerInfo($vStr)
    {
        $keywords = self::tokenizer($vStr);
        $areas = [];
        $words = [];
        foreach ($keywords as $item) {
            if ($item['type'] == 'area') {
                array_push($areas,$item['token']);
            }
            if ($item['type'] == 'words') {
                array_push($words,$item['token']);
            }
        }
        return [
            'numTotal' => count($keywords),
            'areasNum' => count($areas),
            'wordsNum' => count($words),
            'areas'=>$areas,
            'words'=>$words
        ];
    }
}